package com.demo.app

import android.os.StrictMode

/**
Android 2.3提供一个称为严苛模式StrictMode的调试特性，Google称该特性已经使数百个Android上的Google应用程序受益。那它都做什么呢？
它将报告与线程及虚拟机相关的策略违例。
一旦检测到策略违例policy violation，你将获得警告，其包含了一个栈trace显示你的应用在何处发生违例。
你可以强制用警告代替崩溃crash，也可以仅将警告计入日志让你的应用继续执行。
StrictMode是一个十分有用的类，它可以很方便地应用于检查Android应用程序的性能和存在的问题。
当开启这个模式后，开发者能很好地检查应用中存在的潜在问题。

StrictMode分为以下两种策略：

1. 线程监控策略
2.VM虚拟机监控策略
 **/

class ApplicationStrictMode : ApplicationLeakTest() {

    override fun onCreate() {
        super.onCreate()
        enabledStrictMode()
    }

    private fun enabledStrictMode() {


        StrictMode.setThreadPolicy(
            StrictMode.ThreadPolicy.Builder()
                .detectAll()//检测当前线程所有函数
                .penaltyLog()//表示将警告输出到LogCat，你也可以使用其他或增加新的惩罚（penalty）函数，例如使用penaltyDeath()的话
//                .penaltyDeath()//一旦StrictMode消息被写到LogCat后应用就会崩溃
                .build()
        )
/*
（1）setThreadPolicy()：将对当前线程应用该策略
（2）detectDiskReads():监控磁盘读
（3）detectDiskWrites():监控磁盘写
（4）detectNetwork():监控网络访问
（5）detectAll()：
（6）penaltyLog():
你不需要频繁打开严苛模式，你可以在Activity的onCreate()函数中打开它，你也可以在Application派生类的OnCreate()函数中设置严苛模式。
线程中运行的任何代码都可以设置严苛模式（StrictMode），但你的确只需要设置一次，一次就够了。
*/




        StrictMode.setVmPolicy(
            StrictMode.VmPolicy.Builder()
//                .detectLeakedSqlLiteObjects()
                .detectActivityLeaks()//检测Activity泄露
                .detectAll()
                .penaltyLog()
//                .penaltyDeath()
                .build()
        );
/*
VM略重点关注如下几类：
(1)内存泄露的Activity对象
(2)内存泄露的SQLite对象
(3)内存泄露的其他任何类似可关闭对象
内存泄露的Activity对象和内存泄露的SQLite对象都比较好理解，而所谓“其他任何类似可关闭对象”的检查，主要是去监那些本该释放的对象，比如应该调用close()方法的对象。
*/


/*
3. 应该说大部分由StrictMode产生的规则警示都应去遵守，但有时也不是所有产生的信息都表明你的程序有错误。
比如，在应用程序的主线程中去快速读写磁盘其实不会对应用的性能产生太大的影响，又或者你在调试程序阶段有一些调试的代码违反了设定的规则，这些都可以忽略掉这些规则。

忽略规则有两种方法，一种是单纯在代码中把Strictmode的代码注释掉，
另外一种比较好的方法是，在需要忽略的时候和地方，增加相应的代码去让系统停止使用这些规则去检查，等开发者认为有必要检查时，再重新应用这些规则，比如：

StrictMode.ThreadPolicy old = StrictMode.getThreadPolicy();
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(old)
　　.permitDiskWrites()
　　.build());
//TODO: do write something to disk
StrictMode.setThreadPolicy(old);

这里首先用old来保存了当前的策略规则，然后do write something to disk；这里执行了一些向磁盘快速读写的操作，最后又重新启用了这些规则。

*/

    }


}
